#include "localprocess.h"

localProcess::localProcess()
{

}

void localProcess::writeChat(QString id, QString name, QString friendId, QString content, QString time, QString mode){
    /**
     * @brief file
     * id表示发消息的人的id，friendID表示对话好友的id，content即对话内容, mode指写入文件的聊天类型，分为"friend"和"group"
     */

    QString path = QCoreApplication::applicationDirPath() + "/chatData/" + (mode=="friend"?"_single_":"_group_") + friendId+".xml";

    QFile file(path); //相对路径、绝对路径、资源路径都可以
    qDebug()<<path;
    if(!file.open(QFile::ReadOnly)){
        //可以用QIODevice，Truncate表示清空原来的内容
        //QMessageBox::warning(this, "警告", "读取历史消息失败");
        qDebug()<<"unable to read";
        return;
    }
    QDomDocument doc;
    if(!doc.setContent(&file))
    {
        file.close();
        return;
    }
    file.close();

    QDomElement root=doc.documentElement();
    QDomElement mess=doc.createElement("message");
    mess.setAttribute("id",id);
    //mess.setAttribute("time",QDateTime::currentDateTime().toString());
    mess.setAttribute("time",time);
    if(mode=="group"){
        mess.setAttribute("name", name);
    }
    QDomElement title=doc.createElement("content");
    QDomText text;
    text=doc.createTextNode(content);
    title.appendChild(text);
    mess.appendChild(title);
    root.appendChild(mess);

    if(!file.open(QFile::WriteOnly|QFile::Truncate)){ //先读进来，再重写，如果不用truncate就是在后面追加内容，就无效了
        //QMessageBox::warning(this, "警告", "聊天记录写入本地失败");
        qDebug()<<"unable to write";
        return;
    }
    //输出到文件
    QTextStream out_stream(&file);
    doc.save(out_stream,4); //缩进4格
    file.close();
}

void localProcess::writeChat(QList<QString> id, QList<QString> name, QString friendId, QList<QString> content, QList<QString> time, QString mode){
    /**
     * @brief file
     * id表示发消息的人的id，friendID表示对话好友的id，content即对话内容, mode指写入文件的聊天类型，分为"friend"和"group"
     */

    QString path = QCoreApplication::applicationDirPath() + "/chatData/" + (mode=="friend"?"_single_":"_group_") + friendId+".xml";

    QFile file(path); //相对路径、绝对路径、资源路径都可以
    qDebug()<<path;
    if(!file.open(QFile::ReadOnly)){
        //可以用QIODevice，Truncate表示清空原来的内容
        //QMessageBox::warning(this, "警告", "读取历史消息失败");
        qDebug()<<"unable to read";
        return;
    }
    QDomDocument doc;
    if(!doc.setContent(&file))
    {
        file.close();
        return;
    }
    file.close();

    QDomElement root=doc.documentElement();
    for (int i=0;i<id.size();i++){
        QDomElement mess=doc.createElement("message");
        mess.setAttribute("id",id[i]);
        mess.setAttribute("time",time[i]);
        if(mode=="group"){
            mess.setAttribute("name", name[i]);
        }
        QDomElement title=doc.createElement("content");
        QDomText text;
        text=doc.createTextNode(content[i]);
        title.appendChild(text);
        mess.appendChild(title);
        root.appendChild(mess);
    }


    if(!file.open(QFile::WriteOnly|QFile::Truncate)){ //先读进来，再重写，如果不用truncate就是在后面追加内容，就无效了
        //QMessageBox::warning(this, "警告", "聊天记录写入本地失败");
        qDebug()<<"unable to write";
        return;
    }
    //输出到文件
    QTextStream out_stream(&file);
    doc.save(out_stream,4); //缩进4格
    file.close();
}


void localProcess::newChatFriend(QString id, QString mode){
    /**
     * @brief file
     * id表示群聊或好友id，mode指写入文件的聊天类型，分为"friend"和"group"
     */
    QDomDocument doc;
    //打开或创建文件

    QString path = QCoreApplication::applicationDirPath() + "/chatData/" + (mode=="friend"?"_single_":"_group_") + id+".xml";
    QFile file(path); //相对路径、绝对路径、资源路径都可以
    qDebug()<<path;
    if(!file.open(QFile::ReadWrite|QFile::Truncate)){
        //可以用QIODevice，Truncate表示清空原来的内容
        //QMessageBox::warning(this, "警告", "聊天记录文件创建失败");
        qDebug()<<"unable to read and write";
        return;
    }

    //写入xml头部
    QDomProcessingInstruction instruction; //添加处理命令
    instruction=doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
    doc.appendChild(instruction);
    //添加根节点
    QDomElement root=doc.createElement("chatdata");
    qDebug()<<root.nodeName();
    doc.appendChild(root);

    //添加第一个子节点及其子元素
    QDomElement book=doc.createElement("message");
    book.setAttribute("id",0); //方式一：创建属性  其中键值对的值可以是各种类型

    QDomAttr time=doc.createAttribute("time"); //方式二：创建属性 值必须是字符串
    time.setValue(QDateTime::currentDateTime().toString());
    book.setAttributeNode(time);
    if(mode=="group"){
        book.setAttribute("name", "Manager");
    }

    QDomElement title=doc.createElement("content"); //创建子元素
    QDomText text; //设置括号标签中间的值
    text=doc.createTextNode(mode=="friend"?"你们已经成为好友了，请开始聊天吧！":"你已加入群聊，请开始聊天吧！");
    book.appendChild(title);
    title.appendChild(text);
    root.appendChild(book);

    //输出到文件
    QTextStream out_stream(&file);
    doc.save(out_stream,4); //缩进4格
    file.close();
}

QList<QList<QString>> localProcess::readHistory(QString id, QString mode){
    /*
     * @brief path
     * id指发信人id，mode指"friend"或"group"
     */
    QString path = QCoreApplication::applicationDirPath()
            + "/chatData/" + (mode=="friend"?"_single_":"_group_") + id+".xml";
    QFile file(path); //相对路径、绝对路径、资源路径都可以
    qDebug()<<path;
    QList<QList<QString>> messages;
    if(!file.open(QFile::ReadOnly)){
        //可以用QIODevice，Truncate表示清空原来的内容
        //QMessageBox::warning(this, "警告", "读取历史消息失败");
        return messages;
    }
    QDomDocument doc;
    if(!doc.setContent(&file))
    {
        file.close();
        return messages;
    }
    file.close();

    QDomElement root=doc.documentElement();

    qDebug()<<root.nodeName();
    QDomNode node=root.firstChild(); //获得第一个子节点
    while(!node.isNull())  //如果节点不空
    {
        if(node.isElement()) //如果节点是元素
        {
            QList<QString> single;
            QDomElement e=node.toElement(); //转换为元素，注意元素和节点是两个数据结构，其实差不多
            qDebug()<<e.tagName()<<" "<<e.attribute("id")<<" "<<e.attribute("time"); //打印键值对，tagName和nodeName是一个东西
            single<<e.attribute("id")<<e.attribute("time");
            if(mode=="group"){
                single<<e.attribute("name");
            }
            QDomNodeList list=e.childNodes();
            single<<list.at(0).nodeValue();
            messages<<single;
        }
        node=node.nextSibling(); //下一个兄弟节点,nextSiblingElement()是下一个兄弟元素，都差不多
    }
    return messages;
}

QString localProcess::getLastTime(QString id, QString mode){
    /*
     * @brief path
     * id指发信人id，mode指"friend"或"group"
     */
    QString path = QCoreApplication::applicationDirPath()
            + "/chatData/" + (mode=="friend"?"_single_":"_group_") + id+".xml";
    QFile file(path); //相对路径、绝对路径、资源路径都可以
    qDebug()<<path;
    if(!file.open(QFile::ReadOnly)){
        //可以用QIODevice，Truncate表示清空原来的内容
        //QMessageBox::warning(this, "警告", "读取历史消息失败");
        return "";
    }
    QDomDocument doc;
    if(!doc.setContent(&file))
    {
        file.close();
        return "";
    }
    file.close();

    QList<QList<QString>> messages;
    QDomElement root=doc.documentElement();

    qDebug()<<root.nodeName();
    QDomNode node=root.lastChild(); //获得最后一个子节点
    return node.toElement().attribute("time");
}
